package Day_0219.JavaBase;

/**
 * @author zxc
 * @date 2023/02/19 08:49
 **/
public class Autoboxing_Unboxing {
    public static void main(String[] args) {
        /**
         * 谈一谈对于自动装箱和拆箱的理解
         * ===》
         * （1）装箱： （基本数据类型 -> 引用类型/包装类型）
         *  ===》将基本类型用它们对应的引用类型包装起来；
         * （2）拆箱：（引用类型/包装类型 -> 基本数据类型）
         *  ===》将包装类型转换为基本数据类型；
         *
         * Java 为每个原始类型提供了包装类型：
         * （1）原始类型: boolean，char，byte，short，int，long，float，double
         * （2）包装类型：Boolean，Character，Byte，Short，Integer，Long，Float，Double
         *
         */

        /**
         * Integer a= 127 与 Integer b = 127相等吗
         * ===》
         * （1）对于对象引用类型：（包装类型/引用类型）
         *  == 比较的是对象的内存地址。
         * （2）对于基本数据类型：（基本数据类型）
         *  == 比较的是值。
         * （3）如果整型字面量的值在-128到127之间，那么自动装箱时不会new新的Integer对象，
         *  而是直接引用常量池中的Integer对象，超过范围 a1==b1的结果是false;
         *  ===》
         *  即，若是所使用的Integer类型取值范围[-128,127]的话，
         *  不会去创建新的Integer对象，而是重复使用常量池中的Integer对象;
         *
         */
        Integer a = new Integer(3);
        Integer b = 3; // 将3自动装箱成Integer类型
        int c = 3;
        System.out.println(a == b); // 两个引用没有引用同一对象
        System.out.println(a == c); // a自动拆箱成int类型再和c比较
        System.out.println(b == c);
        Integer a1 = 128;
        Integer b1 = 128;
        System.out.println(a1 == b1); // 使用的是，两个不同的Integer对象（尽管两个Integer对象的值是相同的;）
        Integer a2 = 127;
        Integer b2 = 127;
        System.out.println(a2 == b2); // 使用的是，常量池中相同的Integer对象;
    }
}
